home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #1 / Amiga Plus CD - 2000 - No. 1.iso / Games / Starter / JST / Developer / sources / src / loaders / Xout / xout2file.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-12-03  |  3.7 KB  |  183 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <signal.h>
  4.  
  5. #include <dos/dos.h>
  6. #include <proto/dos.h>
  7. #include <proto/exec.h>
  8. #include <exec/execbase.h>
  9. #include <exec/libraries.h>
  10. #include <exec/memory.h>
  11. #include <pragmas/dos_pragmas.h>
  12. #include <string.h>
  13.  
  14. #define RAWTRACK_LEN 0x8000
  15. #define TRACK_LEN 0x1750
  16.  
  17. extern struct ExecBase *SysBase;
  18.  
  19. extern APTR InitTrackDisk(ULONG);
  20. extern void ShutTrackDisk(void);
  21. extern ULONG CheckDiskIn (void);
  22.  
  23. extern ULONG ReadRawTrackIndex(ULONG,UBYTE *);
  24. extern ULONG DecodeTrack(UBYTE *, UBYTE *);
  25. UBYTE *rawTrackBuffer=0L;
  26. UBYTE *decTrackBuffer=0L;
  27. char *charunit="DF0:";
  28. int allocated=0,diskinit=0;
  29. FILE *f;
  30.  
  31. void CloseAll(char *mess)
  32.  
  33. {
  34. if (f) fclose(f);
  35.  
  36. if (mess) printf("** %s\n",mess);
  37.  
  38. if (diskinit) ShutTrackDisk();
  39. if (allocated) Inhibit(charunit,FALSE);
  40. if (rawTrackBuffer) FreeMem((APTR)rawTrackBuffer,RAWTRACK_LEN);
  41. if (decTrackBuffer) FreeMem((APTR)decTrackBuffer,TRACK_LEN);
  42.  
  43.  
  44. exit(0);
  45. }
  46.  
  47. void BreakHandle(int code)
  48.  
  49. {
  50. CloseAll("User break");
  51. }
  52.  
  53.  
  54. int findArg(unsigned int argc,char ** argv,char * argstr)
  55. {
  56.   int argl,i;
  57.  
  58.   argl=strlen(argstr);
  59.  
  60.   for (i=0;i<argc;i++)
  61.     if (!strncmp(argv[i],argstr,argl)) return i;
  62.  
  63.   return 0;
  64. }
  65.  
  66.  
  67. main(unsigned int argc,char ** argv)
  68.  
  69.  
  70. {
  71.   ULONG diskunit=0,starttrack=2,endtrack=159; /* default values */
  72.   ULONG ignore_errors=0;
  73.   int i,retries,readok,dcrslt;
  74.   char filename[108]="";
  75.  
  76.   signal(SIGINT,BreakHandle); /* CTRL-C caught */
  77.  
  78.   printf("\2331;37;40mXout2File \2330;31;40m - The X-Out Disks image maker by Jean-François Fabre\n");
  79.  
  80.   switch(argc)
  81.  
  82.      {
  83.  
  84.     case 5:
  85.         endtrack=atoi(argv[4]);
  86.         if ((endtrack>159)||(endtrack<0))
  87.               CloseAll("StartTrack must be between 0 and 159\n");
  88.     case 4:
  89.         starttrack=atoi(argv[3]);
  90.         if ((starttrack>endtrack)||(starttrack<0))
  91.               CloseAll("StartTrack must be between 0 and 159\n");
  92.  
  93.     case 3:
  94.         strcpy(filename,argv[2]);
  95.         diskunit=(ULONG)argv[1][0]-'0';
  96.         break;
  97.         
  98.     default:
  99.         printf("\nUsage : xout2file <unit> <filename> [<starttrack>] [<endtrack>]\n");
  100.         printf("Defaults are:\n  StartTrack: 2\n  EndTrack: 159\n\nYou must specify a filename for the destination\n");
  101.         if (!argc) Delay(200);
  102.         CloseAll(0);
  103.     }
  104.  
  105.  
  106.   diskunit=(ULONG)argv[1][0]-'0';
  107.  
  108.   if ((diskunit>3)||(diskunit<0)) {printf("** Unit %d unavailable\n",diskunit);CloseAll(0);}
  109.  
  110.   charunit[2]=diskunit+'0';
  111.  
  112.   if (SysBase->LibNode.lib_Version>36)
  113.     {
  114.     if(Inhibit(charunit,DOSTRUE)==FALSE) CloseAll("Can't allocate device !");
  115.     allocated=1;
  116.     }
  117.  
  118.   if ((ULONG)InitTrackDisk(diskunit)<0) {printf("** Can't open unit %d !",diskunit);CloseAll(0);}
  119.  
  120.   diskinit=1;
  121.   if (CheckDiskIn()) {printf("** No disk in unit %d !\n",diskunit);CloseAll(NULL);}
  122.  
  123.   decTrackBuffer=(char *)AllocMem(TRACK_LEN,MEMF_CLEAR);
  124.   if (decTrackBuffer==0L) CloseAll("Can't allocate memory.");
  125.  
  126.   rawTrackBuffer=(char *)AllocMem(RAWTRACK_LEN,MEMF_CHIP|MEMF_CLEAR);
  127.   if (rawTrackBuffer==0L) CloseAll("Can't allocate chip memory.");
  128.  
  129.   f=fopen(filename,"wb");
  130.  
  131.   if (f==NULL) CloseAll("Can't create destination file!");
  132.  
  133.   printf("Reading disk from track %d to track %d (included)\n",starttrack,endtrack);
  134.  
  135.   for (i=starttrack;i<endtrack+1;i++)
  136.     {
  137.     retries=0;
  138.     readok=0;
  139.  
  140.     do
  141.     {
  142.  
  143.         if (ReadRawTrackIndex(i,rawTrackBuffer))
  144.             {
  145.             if (retries>2) CloseAll("Low level disk read error!");
  146.             }
  147.  
  148.         else
  149.         
  150.             {    
  151.  
  152.              dcrslt=DecodeTrack(rawTrackBuffer,decTrackBuffer);
  153.  
  154.             if (!dcrslt)
  155.                     {
  156.                         readok=1;
  157.                         if (fwrite(decTrackBuffer,1,TRACK_LEN,f)!=TRACK_LEN) CloseAll("Disk full !");
  158.                     }
  159.  
  160.             else
  161.                     {
  162.                         if (retries>2)
  163.  
  164.                             switch(dcrslt)
  165.                             {    
  166.                             case -1: printf("** Error Track %d\n",i);CloseAll("Decode disk read error!");
  167.                             default: printf("** Error Track %d\n",i);CloseAll("No sync found!");
  168.                             }
  169.                     }
  170.  
  171.             }
  172.  
  173.     retries++;
  174.     }
  175.     while (!readok);
  176.     }
  177.  
  178.     printf("Disk image done\n");
  179.  
  180.     CloseAll(0);
  181. }
  182.  
  183.